#include "drv_nrf.h"

uint8_t T_ADDR[5] = {0xF0, 0xF0, 0xF0, 0xF0, 0x01};    //发送地址
uint8_t R_ADDR_P0[5] = {0xF0, 0xF0, 0xF0, 0xF0, 0x01}; //接收地址
uint8_t R_ADDR_P1[5] = {0x01, 0xF0, 0xF0, 0xF0, 0x01}; //接收地址  只有第一个值不一样，其他值要保持相同
#define  SPI_NRF  hspi4
/*一些基本的操作函数*/
void W_CSN(uint8_t Value)
{
    HAL_GPIO_WritePin(CSN_PORT,CSN_Pin, Value);
} //对CSN的写操作

void W_CE(uint8_t Value)
{
    HAL_GPIO_WritePin(CE_PORT,CE_Pin, Value);
} //对Ce的写操作

uint8_t R_IRQ(void)
{
    return HAL_GPIO_ReadPin(IRQ_PORT,IRQ_Pin);
}


uint8_t SPI_SwapByte(uint8_t Byte)
{
    uint8_t i, GetByte = 0x00;
    HAL_SPI_TransmitReceive(&SPI_NRF, &Byte, &GetByte, 1, 0x10);
    return GetByte; //返回从机交换的数据
}

/*主机与从机交换一个字节，SPI通信的基本过程*/

void W_Reg(uint8_t Reg, uint8_t Value)
{
    W_CSN(0);            //选中NRF24L01
    SPI_SwapByte(Reg);   //指令
    SPI_SwapByte(Value); //要写入的值
    W_CSN(1);            //取消选中NRF24L01
}

/*对对应寄存器的写操作*/
uint8_t R_Reg(uint8_t Reg)
{
    uint8_t Value;
    W_CSN(0);                  //选中NRF24L01
    SPI_SwapByte(Reg);         //指令
    Value = SPI_SwapByte(NOP); //读寄存器的值
    W_CSN(1);                  //取消选中NRF24L01
    return Value;
}

/*对对应寄存器的读操作*/

void W_Buf(uint8_t Reg, uint8_t *Buf, uint8_t len)
{
    uint8_t i;
    W_CSN(0);          //选中NRF24L01
    SPI_SwapByte(Reg); //写命令与寄存器地址
    for (i = 0; i < len; i++)
    {
        SPI_SwapByte(Buf[i]);
    }
    //  HAL_SPI_Transmit(&hspi1,Buf,len,0x10);
    W_CSN(1); //取消选中NRF24L01
}             //写多个数据


void R_Buf(uint8_t Reg, uint8_t *Buf, uint8_t len)
{
    uint8_t i;
    W_CSN(0); //选中NRF24L01
    SPI_SwapByte(Reg);
    for (i = 0; i < len; i++)
    {
        Buf[i] = SPI_SwapByte(NOP);
    }
    W_CSN(1); //取消选中NRF24L01
}             //读多个数据

void NRF24L01_Init_Rx(void)
{
    W_CE(0);
    W_Buf(NRF_WRITE_REG + TX_ADDR, T_ADDR, 5);       //配置发送通道TX的地址
    W_Buf(NRF_WRITE_REG + RX_ADDR_P0, R_ADDR_P0, 5); //配置接收通道0地址,通道0的地址要与发送端0的地址相同
    W_Buf(NRF_WRITE_REG + RX_ADDR_P1, R_ADDR_P1, 5); //配置接收通道1地址,通道1的地址要与发送端1的地址相同
    W_Reg(NRF_WRITE_REG + CONFIG, 0x0F);             //配置成发送模式（最后一位为0）
    W_Reg(NRF_WRITE_REG + EN_AA, 0x03);              //开启接收通道0和通道1自动应答
    W_Reg(NRF_WRITE_REG + RF_CH, 0x64);              //配置通信频率2.5G
    W_Reg(NRF_WRITE_REG + RF_SETUP, 0x1a);
    W_Reg(NRF_WRITE_REG + RX_PW_P0, 9);     //配置接受通道0接收的数据宽度9字节
    W_Reg(NRF_WRITE_REG + RX_PW_P1, 9);     //配置接受通道1接收的数据宽度9字节
    W_Reg(NRF_WRITE_REG + EN_RXADDR, 0x03); //使能接收通道0和通道1
    W_Reg(FLUSH_RX,NOP);                    //清除接收数据缓存器
    W_CE(1);
}

/*
 NRF24L01接收数据
 param: Buf为接收数据的数组的首地址
 固定接收9个字节
 第一字节为0,代表未接收到数据
 第一字节为1,代表为串口屏数据
 第一字节为2,代表为遥控器摇杆数据
 第一字节为3,代表队友车辆数据
 字节1,2为左摇杆x轴数据,3,4为左摇杆y轴数据,5,6为右摇杆x轴数据,7,8为右摇杆y轴数据
 返回值:返回接收数组的第一个字节
 */
uint8_t NRF_Recv(uint8_t *Buf)
{
    uint8_t Status;
    Status = R_Reg(NRF_READ_REG + STATUS);
    if (Status & 0x40)
    {
        R_Buf(RD_RX_PLOAD, Buf, 9);            //读到的数据存进了Buf
        W_Reg(FLUSH_RX,NOP);                   //清除接收数据缓存器
        W_Reg(NRF_WRITE_REG + STATUS, Status); //清除中断
    }
    else
        Buf[0] = 0;
    return Buf[0];
}

/*
 NRF24L01自检
 返回值: 1 自检失败
 返回值: 0 自检成功
 */
uint8_t NRF24L01_Check()
{
    uint8_t buf[5] = {0XA5, 0XA5, 0XA5, 0XA5, 0XA5};
    uint8_t i;
    W_Buf(NRF_WRITE_REG + TX_ADDR, buf, 5); //写入5个字节的地址.
    R_Buf(TX_ADDR, buf, 5);                 //读出写入的地址
    for (i = 0; i < 5; i++)
        if (buf[i] != 0XA5)
            break;
    if (i != 5)
        return 1; //检测24L01错误
    return 0;     //检测到24L01
}
